package API_Systeme;

import API_Db.*;
import API_Systeme.Adapter.*;
import java.util.Date;

/**
 *
 * @author Wan
 */
public class API_Systeme_Compte
{

    /**
     * Instance de API_Db_Compte
     */
    private IAPI_Db_Compte API_Db_C = new API_Db_Compte();
    /**
     * Instance de l API bancaire
     */
    private IAPI_Systeme_Banque API_Sys_Banque = new Adapter_Systeme_Banque();

    /**
     * Ajout de credit sur le compte demande a la banque si positif mis a jour de la bdd
     * @param numero
     * @param crypto
     * @param date_exp
     * @param nom_proprio
     * @param prenom_proprio
     * @param montant
     * @param id_utilisateur
     * @throws Exception 
     */
    public void crediterCompte(String numero, int crypto, String date_exp, String nom_proprio, String prenom_proprio, double montant, int id_utilisateur) throws Exception
    {
        switch (API_Sys_Banque.debiterBanque(numero, crypto, date_exp, nom_proprio, prenom_proprio, montant))
        {
            case 1:
                if (API_Db_C.crediterCompteDB(id_utilisateur, montant) == 0)
                {
                    throw new Exception("Le compte de l'utilisateur n'existe pas");
                }
                break;
            case -10:
                throw new Exception("Erreur banque");
        }

    }
   
    /**
     * Retirer du cre
     * @param nom
     * @param prenom
     * @param montant
     * @param id_utilisateur
     * @throws Exception 
     */
    public void debiterCompte(String nom, String prenom, String codeBanque, String codeGuichet, String numCompte, String cleRib, Double montant, int id_utilisateur) throws Exception
    {
        Double soldeActuel = 0.00;
        Double soldeFutur = 0.00;
        soldeActuel = API_Db_C.getSoldeCompteDB(id_utilisateur);

        if (soldeActuel == -1)
        {
            throw new Exception("Le compte de l'utilisateur n'existe pas");
        }

        soldeFutur = soldeActuel - montant;

        if (soldeFutur < 0.00)
        {
            throw new Exception("Solde de crédit insufisant");
        }

        switch (API_Sys_Banque.crediterBanque(nom, prenom, codeBanque, codeGuichet, numCompte, cleRib, montant))
        {
            case 1:
                API_Db_C.debiterCompteDB(id_utilisateur, montant);
                break;
            case -10:
                throw new Exception("Erreur banque");
        }
    }

    /**
     * Transfert de credit entre comptes utilistaeurs
     * @param id_util_dest
     * @param id_util_src
     * @param montant
     * @throws Exception 
     */
    public void transfertCompte(int id_util_dest, int id_util_src, Double montant) throws Exception
    {
        Double soldeActuel = 0.00;
        Double soldeFutur = 0.00;
        soldeActuel = API_Db_C.getSoldeCompteDB(id_util_src);

        if (soldeActuel == -1)
        {
            throw new Exception("Le compte de l'utilisateur source n'existe pas");
        }

        soldeFutur = soldeActuel - montant;

        if (soldeFutur < 0.00)
        {
            throw new Exception("Solde de crédit insufisant");
        }

        if (API_Db_C.crediterCompteDB(id_util_dest, montant) == 0)
        {
            throw new Exception("Le compte de l'utilisateur destinataire n'existe pas");
        }
        API_Db_C.debiterCompteDB(id_util_src, montant);
    }

    /**
     * Ce produit lors de la fermeture du profil utilisateur
     * @param nom
     * @param prenom
     * @param id_utilisateur
     * @throws Exception 
     */
    public void cloturerCompte(String nom, String prenom, String codeBanque, String codeGuichet, String numCompte, String cleRib, int id_utilisateur) throws Exception
    {
        Double solde = API_Db_C.getSoldeCompteDB(id_utilisateur);
        if (solde == - 1)
        {
            throw new Exception("Le compte de l'utilisateur n'existe pas");
        }
        API_Sys_Banque.crediterBanque(nom, prenom, codeBanque, codeGuichet, numCompte, cleRib, solde);
        API_Db_C.cloturerCompteDB(id_utilisateur);
    }
}
